#ifndef __UNIQUE_PTR_H__
#define __UNIQUE_PTR_H__

namespace wqc
{
template <typename TYPE>
class unique_ptr
{
private:
    /* data */
public:
    unique_ptr(TYPE* ptr):
        m_ptr(ptr)
    {

    }

    ~unique_ptr()
    {
        if (m_ptr != nullptr)
        {
            delete m_ptr;
        }
    }

    // 禁用拷贝构造函数和赋值运算符，避免不同的智能指针对象引用同一块内存，出现内存重复释放的问题
    // 带来的问题：无法进行拷贝，但是有时拷贝又是需要的
    unique_ptr(const unique_ptr<TYPE>& other) = delete;
    unique_ptr<TYPE>& operator=(const unique_ptr<TYPE>& other) = delete;

    // 重载裸指针相关的运算符
    TYPE& operator*()
    {
        return *m_ptr;
    }

    TYPE* operator->()
    {
        return m_ptr;    
    }
private:
    TYPE* m_ptr;
};
} // end of namespace wqc

#endif /* end of __UNIQUE_PTR_H__ */
